home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABERMUD.ZIP / TK.C < prev    next >
C/C++ Source or Header  |  1989-07-08  |  13KB  |  646 lines

  1. /*
  2.  *
  3.  *        AberMUD II   C
  4.  *
  5.  *
  6.  *    This game systems, its code scenario and design
  7.  *    are (C) 1987/88  Alan Cox,Jim Finnis,Richard Acott
  8.  *
  9.  *
  10.  *    This file holds the basic communications routines
  11.  *
  12.  */
  13.  
  14. #include "files.h"
  15.  
  16. long i_setup=0;
  17. long oddcat=0;
  18. long  talkfl=0;
  19.  
  20. #include <stdio.h>
  21. #include <sys/errno.h>
  22. #include <sys/file.h>
  23.  
  24. extern FILE * openlock();
  25. extern char globme[];
  26. extern long cms;
  27. extern long curch;
  28. extern long my_str;
  29. extern long my_sex;
  30. extern long my_lev;
  31. extern FILE * openroom(); 
  32. extern FILE * openworld();
  33. extern char * pname();
  34. extern char * oname();
  35. extern long ppos();
  36. extern char key_buff[];
  37. long cms= -1;
  38. long curch=0;
  39.  
  40. char globme[40];
  41. long  curmode=0;
  42. long  meall=0;
  43.  /*
  44.  
  45.  Data format for mud packets
  46.  
  47.  Sector 0
  48.  [64 words]
  49.  0   Current first message pointer
  50.  1   Control Word
  51.  Sectors 1-n  in pairs ie [128 words]
  52.  
  53.  [channel][controlword][text data]
  54.  
  55.  [controlword]
  56.  0 = Text
  57.  - 1 = general request
  58.  
  59.  */
  60.  
  61. vcpy(dest,offd,source,offs,len)
  62. long *dest,*source;
  63. long offd,offs,len;
  64.     {
  65.     long c;
  66.     c=0;
  67.     while(c<len)
  68.        {
  69.        dest[c+offd]=source[c+offs];
  70.        c++;
  71.        }
  72.     }
  73.  
  74.  mstoout(block,name)
  75.  long *block;char *name;
  76.     {
  77.     extern long debug_mode;
  78.     char luser[40];
  79.     char *x;
  80.     x=(char *)block;
  81.     /* Print appropriate stuff from data block */
  82.     strcpy(luser,name);lowercase(luser);
  83. if(debug_mode)    bprintf("\n<%d>",block[1]);
  84.     if (block[1]<-3) sysctrl(block,luser);
  85.     else
  86.        bprintf("%s", (x+2*sizeof(long)));
  87.     }
  88.  
  89. long gurum=0;
  90. long convflg=0;
  91.  
  92. sendmsg(name)
  93.  char *name;
  94.     {
  95.     extern int debug_mode;
  96.     extern char *sysbuf;
  97.     extern long curch,moni,mynum;
  98.     char prmpt[32];
  99.     long a;
  100. extern long tty;
  101.     char work[200];
  102.     long w2[35];
  103.     extern char key_buff[];
  104.     extern long convflg;
  105.     extern long my_lev;
  106. extern long my_str;
  107. extern long in_fight;
  108. extern long fighting;
  109.     extern long curmode;
  110.     l:pbfr();
  111. if(tty==4) btmscr();
  112. strcpy(prmpt,"\r");
  113.     if(pvis(mynum)) strcat(prmpt,"(");
  114.     if(debug_mode) strcat(prmpt,"#");
  115.     if(my_lev>9)strcat(prmpt,"----");
  116.     switch(convflg)
  117.        {
  118.        case 0:
  119.           strcat(prmpt,">");
  120.           break;
  121.        case 1:
  122.           strcat(prmpt,"\"");
  123.           break;
  124.        case 2:
  125.           strcat(prmpt,"*");
  126.           break;
  127.        default:
  128.           strcat(prmpt,"?");
  129.           }
  130.     if(pvis(mynum)) strcat(prmpt,")");
  131.     pbfr();
  132.     if(pvis(mynum)>9999) set_progname(0,"-csh");
  133.     else
  134.     sprintf(work,"   --}----- ABERMUD -----{--     Playing as %s",name);
  135.     if(pvis(mynum)==0) set_progname(0,work);
  136.     sig_alon();
  137.     key_input(prmpt,80);
  138.     sig_aloff();
  139.     strcpy(work,key_buff);
  140. if(tty==4) topscr();
  141. strcat(sysbuf,"\001l");
  142. strcat(sysbuf,work);
  143. strcat(sysbuf,"\n\001");
  144. openworld();
  145. rte(name);
  146. closeworld();
  147.     if((convflg)&&(!strcmp(work,"**")))
  148.        {
  149.        convflg=0;
  150.        goto l;
  151.        }
  152.     if(!strlen(work)) goto nadj;
  153. if((strcmp(work,"*"))&&(work[0]=='*')){(work[0]=32);goto nadj;}
  154.     if(convflg)
  155.        {
  156.        strcpy(w2,work);
  157.        if(convflg==1) sprintf(work,"say %s",w2);
  158.        else
  159.           sprintf(work,"tss %s",w2);
  160.        }
  161.     nadj:if(curmode==1) gamecom(work);
  162.     else
  163.        {
  164.        if(((strcmp(work,".Q"))&&(strcmp(work,".q")))&& (!!strlen(work)))
  165.           {
  166.           a=special(work,name);
  167.           }
  168.        }
  169. if(fighting>-1)
  170. {
  171. if(!strlen(pname(fighting))) 
  172. {
  173. in_fight=0;
  174. fighting= -1;
  175. }
  176. if(ploc(fighting)!=curch) 
  177. {
  178. in_fight=0;
  179. fighting= -1;
  180. }
  181. }
  182. if(in_fight) in_fight-=1;
  183.     return((!strcmp(work,".Q"))||(!strcmp(work,".q")));
  184.     }
  185.  
  186.  send2(block)
  187.  long *block;
  188.     {
  189.     FILE * unit;
  190.     long number;
  191.     long inpbk[128];
  192.     extern char globme[];
  193.     extern char *echoback;
  194.         unit=openworld();
  195.     if (unit<0) {loseme();crapup("\nAberMUD: FILE_ACCESS : Access failed\n");}
  196.     sec_read(unit,inpbk,0,64);
  197.     number=2*inpbk[1]-inpbk[0];inpbk[1]++;
  198.     sec_write(unit,block,number,128);
  199.     sec_write(unit,inpbk,0,64);
  200.     if (number>=199) cleanup(inpbk);
  201.     if(number>=199) longwthr();
  202.     }
  203.  
  204.  readmsg(channel,block,num)
  205.  long channel;
  206.  long *block;
  207.  int num;
  208.     {
  209.     long buff[64],actnum;
  210.     sec_read(channel,buff,0,64);
  211.     actnum=num*2-buff[0];
  212.     sec_read(channel,block,actnum,128);
  213.     }
  214.  
  215. FILE *fl_com;
  216. extern long findstart();
  217. extern long findend();
  218.  
  219.  rte(name)
  220.  char *name;
  221.     {
  222.     extern long cms;
  223.     extern long vdes,tdes,rdes;
  224.     extern FILE *fl_com;
  225.     extern long debug_mode;
  226.     FILE *unit;
  227.     long too,ct,block[128];
  228.     unit=openworld();
  229.     fl_com=unit;
  230.     if (unit==NULL) crapup("AberMUD: FILE_ACCESS : Access failed\n");
  231.     if (cms== -1) cms=findend(unit);
  232.     too=findend(unit);
  233.     ct=cms;
  234.     while(ct<too)
  235.        {
  236.        readmsg(unit,block,ct);
  237.        mstoout(block,name);
  238.        ct++;
  239.        }
  240.     cms=ct;
  241.     update(name);
  242.     eorte();
  243.     rdes=0;tdes=0;vdes=0;
  244.     }
  245.     
  246. FILE *openlock(file,perm)
  247. char *file;
  248. char *perm;
  249.     {
  250.     FILE *unit;
  251.     long ct;
  252.     extern int errno;
  253.     extern char globme[];
  254.     ct=0;
  255.    unit=fopen(file,perm);
  256.    if(unit==NULL) return(unit);
  257.    /* NOTE: Always open with R or r+ or w */
  258. intr:if(flock(fileno(unit),LOCK_EX)== -1)
  259.         if(errno==EINTR) goto intr; /* INTERRUPTED SYSTEM CALL CATCH */
  260.     switch(errno)
  261.     {
  262.         case ENOSPC:crapup("PANIC exit device full\n");
  263. /*        case ESTALE:;*/
  264.         case EHOSTDOWN:;
  265.         case EHOSTUNREACH:crapup("PANIC exit access failure, NFS gone for a snooze");
  266.     }
  267.     return(unit);
  268.     }
  269.  
  270.  findstart(unit)
  271.  FILE *unit;
  272.     {
  273.     long bk[2];
  274.     sec_read(unit,bk,0,1);
  275.     return(bk[0]);
  276.     }
  277.  
  278.  findend(unit)
  279.  FILE *unit;
  280.     {
  281.     long bk[3];
  282.     sec_read(unit,bk,0,2);
  283.     return(bk[1]);
  284.     }
  285.  
  286.  
  287.  talker(name)
  288.  char *name;
  289.     {
  290.     extern long curch,cms;
  291.     extern long mynum;
  292.     extern long maxu;
  293.     extern long rd_qd;
  294.     FILE *fl;
  295.     char string[128];
  296.     extern char globme[];
  297.     makebfr();
  298.         cms= -1;putmeon(name);
  299.     if(openworld()==NULL) crapup("Sorry AberMUD is currently unavailable");
  300.     if (mynum>=maxu) {printf("\nSorry AberMUD is full at the moment\n");return(0);}
  301.     strcpy(globme,name);
  302.     rte(name);
  303.         closeworld();
  304.     cms= -1;
  305.     special(".g",name);
  306.     i_setup=1;
  307.     while(1)
  308.        {
  309.        pbfr();
  310.        sendmsg(name);
  311.        if(rd_qd) rte(name);
  312.        rd_qd=0;
  313.        closeworld();
  314.        pbfr();
  315.        }
  316.     }
  317.     
  318. long rd_qd=0;
  319.  
  320.  cleanup(inpbk)
  321.  long *inpbk;
  322.     {
  323.     FILE * unit;
  324.     long buff[128],ct,work,*bk;
  325.     unit=openworld();
  326.     bk=(long *)malloc(1280*sizeof(long));
  327.     sec_read(unit,bk,101,1280);sec_write(unit,bk,1,1280);
  328.     sec_read(unit,bk,121,1280);sec_write(unit,bk,21,1280);
  329.     sec_read(unit,bk,141,1280);sec_write(unit,bk,41,1280);
  330.     sec_read(unit,bk,161,1280);sec_write(unit,bk,61,1280);
  331.     sec_read(unit,bk,181,1280);sec_write(unit,bk,81,1280);
  332.     free(bk);
  333.     inpbk[0]=inpbk[0]+100;
  334.     sec_write(unit,inpbk,0,64);
  335.     revise(inpbk[0]);
  336.     }
  337.  
  338.  
  339.  
  340.  special(string,name)
  341.  char *string,*name;
  342.     {
  343.     extern long curmode;
  344.     char ch,bk[128];
  345.     extern long curch,moni;
  346.     extern long mynum;
  347.     extern long my_str,my_lev,my_sco,my_sex;
  348.     FILE * ufl;
  349.     char xx[128];
  350.     char xy[128];
  351.     char us[32];
  352.     strcpy(bk,string);
  353.     lowercase(bk);
  354.     ch= *bk;
  355.     if (ch!='.') return(0);
  356.     ch=bk[1];
  357.     switch(ch)
  358.        {
  359.        case 'g':
  360.           curmode=1;
  361.           curch= -5;
  362.           initme();
  363.           ufl=openworld();
  364.           setpstr(mynum,my_str);
  365.           setplev(mynum,my_lev);
  366.  if(my_lev<10000) setpvis(mynum,0);
  367.     else setpvis(mynum,10000);
  368.           setpwpn(mynum,-1);
  369.           setpsexall(mynum,my_sex);
  370.           setphelping(mynum,-1);
  371.           cuserid(us);
  372.           sprintf(xy,"\001s%s\001%s  has entered the game\n\001",name,name);
  373.           sendsys(name,name,-10113,curch,xx);
  374.           rte(name);
  375.           if(randperc()>50)trapch(-5);
  376. else{curch= -183;trapch(-183);}
  377. sendsys(name,name,-10000,curch,xy);
  378.           break;
  379.        default:
  380.           printf("\nUnknown . option\n");
  381.           }
  382.     return(1);
  383.     }
  384.  
  385.  
  386.  
  387. long dsdb=0;
  388.  
  389.  
  390. long moni=0;
  391.  
  392.  broad(mesg)
  393.  char *mesg;
  394.     {
  395. extern long rd_qd;
  396. char bk2[256];
  397. long block[128];
  398. rd_qd=1;
  399. block[1]= -1;
  400. strcpy(bk2,mesg);
  401. vcpy(block,2,(long *)bk2,0,126);
  402. send2(block);
  403. }
  404.  
  405. tbroad(message)
  406. char *message;
  407.     {
  408.     broad(message);
  409.     }
  410.     
  411.  sysctrl(block,luser)
  412.  long *block;
  413.  char *luser;
  414.     {
  415.     gamrcv(block);
  416.     }
  417. long  bound=0;
  418. long  tmpimu=0;
  419. char  *echoback="*e";
  420. char  *tmpwiz=".";/* Illegal name so natural immunes are ungettable! */
  421.  
  422.  split(block,nam1,nam2,work,luser)
  423.  long *block;
  424.  char *nam1;
  425.  char *nam2;
  426.  char *work;
  427.  char *luser;
  428.     {
  429.     long wkblock[128],a;
  430.     vcpy(wkblock,0,block,2,126);
  431.     vcpy((long *)work,0,block,64,64);
  432.     a=scan(nam1,(char *)wkblock,0,"",".");
  433.     scan(nam2,(char *)wkblock,a+1,"",".");
  434. if((strncmp(nam1,"The ",4)==0)||(strncmp(nam1,"the ",4)==0))
  435. {
  436. if(!strcmp(lowercase(nam1+4),lowercase(luser))) return(1);
  437. }
  438.     return(!strcmp(lowercase(nam1),lowercase(luser)));
  439.     }
  440.  trapch(chan)
  441.  long chan;
  442.     {
  443. extern long curch;
  444.     extern long mynum;
  445.     FILE *unit;
  446.     extern long my_lev;
  447.     if(my_lev>9) goto ndie;
  448.     ndie:unit=openworld();
  449.     setploc(mynum,chan);
  450.     lookin(chan);
  451.     }
  452.  
  453. long mynum=0;
  454.  
  455.  putmeon(name)
  456.  char *name;
  457.     {
  458.     extern long mynum,curch;
  459.     extern long maxu;
  460.     long ct,f;
  461.     FILE *unit;
  462.     extern iamon;
  463.     iamon=0;
  464.     unit=openworld();
  465.     ct=0;
  466.     f=0;
  467.     if(fpbn(name)!= -1)
  468.        {
  469.        crapup("You are already on the system - you may only be on once at a time");
  470.        }
  471.     while((f==0)&&(ct<maxu))
  472.        {
  473.        if (!strlen(pname(ct))) f=1;
  474.        else
  475.           ct++;
  476.        }
  477.     if(ct==maxu)
  478.        {
  479.        mynum=maxu;
  480.        return;
  481.        }
  482.     strcpy(pname(ct),name);
  483.     setploc(ct,curch);
  484.     setppos(ct,-1);
  485.     setplev(ct,1);
  486.     setpvis(ct,0);
  487.     setpstr(ct,-1);
  488.     setpwpn(ct,-1);
  489.     setpsex(ct,0);
  490.     mynum=ct;
  491. iamon=1;
  492.     }
  493.  
  494.  loseme(name)
  495.  char *name;
  496.     {
  497. extern long iamon;
  498. extern long mynum;
  499. extern long zapped;
  500. char bk[128];
  501. extern char globme[];
  502. FILE *unit;  
  503. sig_aloff(); /* No interruptions while you are busy dying */
  504.                ABOUT 2 MINUTES OR SO */
  505. i_setup=0;
  506.                
  507. unit=openworld();
  508.     dumpitems();
  509. if(pvis(mynum)<10000) {
  510. sprintf(bk,"%s has departed from AberMUDII\n",globme);
  511. sendsys(globme,globme,-10113,0,bk);
  512. }
  513.     pname(mynum)[0]=0;
  514.         closeworld();
  515. if(!zapped) saveme();
  516.         chksnp();
  517.     }
  518.  
  519. long lasup=0;
  520.  
  521.  update(name)
  522.  char *name;
  523.     {
  524.     extern long mynum,cms;
  525.     FILE *unit;
  526.     long xp;
  527.     extern long lasup;
  528.     xp=cms-lasup;
  529.     if(xp<0) xp= -xp;
  530.     if(xp<10) goto noup;
  531.     unit=openworld();
  532.     setppos(mynum,cms);
  533.     lasup=cms;
  534.     noup:;
  535.     }
  536.  
  537.  revise(cutoff)
  538.  long cutoff;
  539.     {
  540.     char mess[128];
  541.     long ct;
  542.     FILE *unit;
  543.     unit=openworld();
  544.     ct=0;
  545.     while(ct<16)
  546.        {
  547.        if((pname(ct)[0]!=0)&&(ppos(ct)<cutoff/2)&&(ppos(ct)!=-2))
  548.           {
  549.           sprintf(mess,"%s%s",pname(ct)," has been timed out\n");
  550.           broad(mess);
  551.           dumpstuff(ct,ploc(ct));
  552.           pname(ct)[0]=0;
  553.           }
  554.        ct++;
  555.        }
  556.     }
  557.  
  558.  lookin(room)
  559.  long room; /* Lords ???? */
  560.     {
  561.     extern char globme[];
  562.     FILE *un1,un2;
  563.     char str[128];
  564.     long xxx;
  565.     extern long brmode;
  566.     extern long curmode;
  567.     extern long ail_blind;
  568.     long ct;
  569.     extern long my_lev;
  570.     closeworld();
  571.     if(ail_blind)
  572.     {
  573.         bprintf("You are blind... you can't see a thing!\n");
  574.     }
  575.     if(my_lev>9) showname(room);
  576.     un1=openroom(room,"r");
  577.     if (un1!=NULL)
  578.     {
  579. xx1:   xxx=0;
  580.        lodex(un1);
  581.            if(isdark())
  582.            {
  583.                   fclose(un1);
  584.                   bprintf("It is dark\n");
  585.                         openworld();
  586.                   onlook();
  587.                   return;
  588.               }
  589.        while(getstr(un1,str)!=0)
  590.           {
  591.           if(!strcmp(str,"#DIE"))
  592.              {
  593.              if(ail_blind) {rewind(un1);ail_blind=0;goto xx1;}
  594.              if(my_lev>9)bprintf("<DEATH ROOM>\n");
  595.              else
  596.                 {
  597.                 loseme(globme);
  598.                 crapup("bye bye.....\n");
  599.                 }
  600.              }
  601.           else
  602. {
  603. if(!strcmp(str,"#NOBR")) brmode=0;
  604. else
  605.              if((!ail_blind)&&(!xxx))bprintf("%s\n",str);
  606.           xxx=brmode;
  607. }
  608.           }
  609.        }
  610.     else
  611.        bprintf("\nYou are on channel %d\n",room);
  612.     fclose(un1);
  613.     openworld();
  614.     if(!ail_blind)
  615.     {
  616.         lisobs();
  617.         if(curmode==1) lispeople();
  618.     }
  619.     bprintf("\n");
  620.     onlook();
  621.     }
  622.  loodrv()
  623.     {
  624.     extern long curch;
  625.     lookin(curch);
  626.     }
  627.  
  628.  
  629. long iamon=0;
  630.  
  631. userwrap()
  632. {
  633. extern char globme[];
  634. extern long iamon;
  635. if(fpbns(globme)!= -1) {loseme();syslog("System Wrapup exorcised %s",globme);}
  636. }
  637.  
  638. fcloselock(file)
  639. FILE *file;
  640. {
  641.     fflush(file);
  642.     flock(fileno(file),LOCK_UN);
  643.     fclose(file);
  644. }
  645.     
  646.